package com.javaweb.secondhand_trading.mapper;

import com.javaweb.secondhand_trading.entity.Product;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * 商品数据访问接口
 * 使用MyBatis注解方式实现数据库操作
 */
@Mapper // 标识这是一个MyBatis的Mapper接口
public interface ProductMapper {

    /**
     * 插入商品信息
     * @param product 商品实体对象
     * @return 受影响的行数
     */
    @Insert("INSERT INTO products(user_id, title, price, description, status) " +
            "VALUES(#{userId}, #{title}, #{price}, #{description}, #{status})")
    @Options(useGeneratedKeys = true, keyProperty = "productId") // 获取自增主键并赋值给productId属性
    int insert(Product product);

    /**
     * 更新商品信息
     * @param product 商品实体对象
     * @return 受影响的行数
     */
    @Update("UPDATE products SET title=#{title}, price=#{price}, description=#{description}, status = #{status} " +
            "WHERE product_id=#{productId} AND user_id=#{userId}")
    int update(Product product);

    /**
     * 删除商品（根据商品ID和用户ID）
     * @param productId 商品ID
     * @param userId 用户ID
     * @return 受影响的行数
     */
    @Update("UPDATE products SET status='removed' WHERE product_id=#{productId} AND user_id=#{userId}")
    int delete(Integer productId, Integer userId);

    /**
     * 根据商品ID查询商品
     * @param productId 商品ID
     * @return 商品实体对象
     */
    @Select("SELECT * FROM products WHERE product_id = #{productId}")
    Product findById(Integer productId);

    /**
     * 查询所有可用的商品（状态为available）
     * @return 商品列表，按创建时间降序排列
     */
    @Select("SELECT * FROM products WHERE status = 'available' ORDER BY created_at DESC")
    List<Product> findAllAvailable();

    /**
     * 根据用户ID查询其所有未删除的商品
     * @param userId 用户ID
     * @return 商品列表，按创建时间降序排列
     */
    @Select("SELECT * FROM products WHERE user_id = #{userId} AND status != 'removed' ORDER BY created_at DESC")
    List<Product> findByUserId(Integer userId);

    /**
     * 根据关键词搜索可用的商品
     * @param keyword 搜索关键词
     * @return 匹配的商品列表
     */
    @Select("SELECT * FROM products WHERE title LIKE CONCAT('%', #{keyword}, '%') AND status = 'available'")
    List<Product> searchByKeyword(String keyword);
}